package cn.ant.Client;

import cn.ant.utils.ChannelUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 死信队列消费者
 * （这里的死信队列是用来演示延迟队列，延迟的消息都会到这，这里的死信队列过来消息后就会被消费，充当延迟）
 *
 * @author Anhui AntLaddie <a href="https://www.cnblogs.com/antLaddie/">(博客园蚂蚁小哥)</a>
 * @version 1.0
 **/
public class DLXConsumer {
    // 通过日志管理器获取Logger对象
    static Logger logger = LogManager.getLogger(DLXConsumer.class);

    // 声明死信交换机名称
    public static final String DLX_EXCHANGE = "DLXExchange";
    // 声明死信队列名称
    public static final String DLX_QUEUE = "DLXQueue";
    // 声明死信交换机到死信队列路由绑定关系（Routing Key）
    public static final String DLX_KEY = "DLXKey";

    public static void main(String[] args) throws IOException {
        // 通过工具类获取一个信道
        Channel channel = ChannelUtil.getChannel();

        // 创建死信交换机（此时死信交换机为直接交换机（路由模式）直接路由到指定队列）
        channel.exchangeDeclare(DLX_EXCHANGE, BuiltinExchangeType.DIRECT,
                true, false, null);
        // 创建死信队列，并设置队列持久化
        channel.queueDeclare(DLX_QUEUE, true, false, false, null);

        // 把死信队列绑定到死信交换机上
        channel.queueBind(DLX_QUEUE, DLX_EXCHANGE, DLX_KEY);
        logger.info("死信队列开始监听队列消息....");

        // 接收消息；自动确认
        channel.basicConsume(DLX_QUEUE, true, (consumerTag, message) -> {
            logger.info("死信队列（DLXQueue）接收并处理本次消息：{}",
                    new String(message.getBody(), StandardCharsets.UTF_8));
        }, (consumerTag) -> {
            logger.info("监听的死信队列（DLXQueue）出现异常；可能队列被删除！{}", consumerTag);
        });
    }
}
